package com.turi.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 运单创建DTO【通过渠道分类】
 */
@Data
public class LabelCreateByChanCategoryDTO {
    /**
     * 订单信息
     */
    @NotNull(message = "订单信息不可为空")
    @Valid
    private OrderInfo orderInfo;
    /**
     * 包裹信息
     */
    @NotNull(message = "包裹信息不可为空")
    @Valid
    private List<PackageInfo> packageList;
    /**
     * 发货地址编码
     */
    @NotBlank(message = "发货地址编码不可为空")
    private String shipFromCd;
    /**
     * 收货地址信息
     */
    @NotNull(message = "收货地址不可为空")
    @Valid
    private ShipToInfo shipToInfo;

    /**
     * 订单信息
     */
    @Data
    public static class OrderInfo {
        /**
         * 服务列表
         */
        @NotEmpty(message = "渠道信息不可为空")
        @Valid
        private List<RateChanCategoryDTO> serviceList;
        /**
         * 客户自定义批次号
         */
        @Length(max = 100, message = "批次号最大长度为100")
        private String batchNo;
        /**
         * 客户自定义订单号
         */
        @Length(max = 100, message = "订单号最大长度为100")
        @NotBlank(message = "{label.order.orderNo.cannot.null}")
        private String orderNo;
        /**
         * 发货时间
         */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private LocalDateTime shipTime;
        /**
         * 备注
         */
        @Length(max = 180, message = "备注最大长度为180")
        private String cmnt;
    }

    /**
     * 包裹信息
     */
    @Data
    public static class PackageInfo {
        /**
         * 包裹号
         */
        private String pkgNo;
        /**
         * 重量
         */
        @NotNull(message = "{label.package.weight.value.cannot.null}")
        private BigDecimal weightValue;
        /**
         * 重量单位
         */
        @NotNull(message = "{label.package.weight.unit.cannot.null}")
        private String weightUnit;
        /**
         * 尺寸-长
         */
        @NotNull(message = "尺寸-长不可为空")
        private BigDecimal sizeLength;
        /**
         * 尺寸-宽
         */
        @NotNull(message = "尺寸-宽不可为空")
        private BigDecimal sizeWidth;
        /**
         * 尺寸-高
         */
        @NotNull(message = "尺寸-高不可为空")
        private BigDecimal sizeHeight;
        /**
         * 尺寸-周长
         */
        private BigDecimal sizeGirth;
        /**
         * 尺寸单位
         */
        @NotNull(message = "尺寸单位不可为空")
        private String sizeUnit;
    }

    /**
     * 收货地址信息
     */
    @Data
    public static class ShipToInfo {
        /**
         * 是否进行地址校验 todo lzm 废弃
         */
        @Length(max = 1, message = "是否地址校验只能为“0”或“1”")
        private String isValid;
        /**
         * 联系人姓名
         */
        @NotBlank(message = "{label.address.contactNm.cannot.null}")
        @Length(max = 50, message = "联系人姓名最大长度为50")
        private String contactFirstNm;
        /**
         * 联系人姓氏
         */
        @NotBlank(message = "收件人姓氏不能为空")
        @Length(max = 50, message = "联系人姓氏最大长度为50")
        private String contactLastNm;
        /**
         * 联系人电话
         */
        private String contactPhone;
        /**
         * 联系人公司
         */
        @Length(max = 40, message = "联系人公司最大长度为40")
        private String contactFirm;
        /**
         * 街道地址1
         */
        @NotBlank(message = "{label.address.addrLine.cannot.null}")
        private String addrLine1;
        /**
         * 街道地址2
         */
        private String addrLine2;
        /**
         * 街道地址3
         */
        private String addrLine3;
        /**
         * 城市
         */
        @Size(min = 3, max = 20, message = "{label.address.city.length}")
        @NotBlank(message = "{label.address.city.cannot.null}")
        private String city;
        /**
         * 州省二字码
         */
        @NotBlank(message = "{label.address.state.cannot.null}")
        @Size(min = 2, max = 2, message = "{label.address.state.length}")
        private String stateCd;
        /**
         * 国家三字码
         */
        @NotBlank(message = "{label.address.ctry.cannot.null}")
        @Size(min = 3, max = 3, message = "{label.address.ctry.length}")
        private String ctryCd;
        /**
         * 邮政编码
         */
        @NotBlank(message = "{label.address.postalCd.cannot.null}")
        private String postalCd;
        /**
         * 邮政编码zip4
         */
        private String postalZipCd;
        /**
         * 三方地址编码
         */
        private String addrCodeOther;
        /**
         * 是否为住宅地址
         */
        private String isResidential;
    }
}
